package org.sunny.string;

import org.apache.commons.lang3.StringUtils;

/**
 * 暴力匹配字符串
 *
 * @author Sunny
 * @date 2020/8/17
 */
public class BruteForce2 {

    public static void main(String[] args) {
        System.out.println(bruteForce("Hello World", "or"));
        System.out.println(bruteForce("Hello World", "H"));
        System.out.println(bruteForce("Hello World", "d"));
        System.out.println(bruteForce("Hello World", "ab"));
    }

    /**
     * 暴力匹配2
     *  以字符为单位，从左到右移动模式串，直到匹配成功
     *  pi 的取值范围 [0, plen)
     *  ti 的取值范围 [0, tlen – plen]
     *
     * @param text 文本串
     * @param pattern 模式串
     * @author Sunny
     * @date 2020/8/17
     */
    public static int bruteForce(String text, String pattern) {
        if (StringUtils.isBlank(text) || StringUtils.isBlank(pattern)) {
            return -1;
        }

        char[] textChars = text.toCharArray();
        char[] patternChars = pattern.toCharArray();

        int tlen = textChars.length;
        int plen = patternChars.length;

        if (tlen < plen) {
            return -1;
        }

        int tiMax = tlen - plen;

        // ti在没有匹配完pattern串或匹配失败前不会增加
        for (int ti = 0; ti <= tiMax; ti++) {
            int pi = 0;
            for (; pi < plen; pi++) {
                //利用 ti + pi 来移动text串匹配的索引
                if (textChars[ti + pi] != patternChars[pi]) break;
            }

            //2种情况会到这里
            //  1、如果匹配成功, ti的位置就是匹配成功的起始索引
            //  2、匹配失败，break跳出
            if (pi == plen) return ti;
        }

        return -1;
    }
}
